package com.odontosis.relatorio.servicoperiodo;

import java.awt.Color;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.lowagie.text.Cell;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.Table;
import com.odontosis.entidade.Servico;
import com.odontosis.entidade.TipoServico;
import com.odontosis.rel.DocumentoBasico;
import com.odontosis.rel.Relatorio;
import com.odontosis.service.ServicoService;
import com.odontosis.util.Constantes;
import com.odontosis.util.StringUtilsOdontosis;
import com.odontosis.view.OdontosisAction;

public class AcaoRelatorioServicoPeriodo extends OdontosisAction<ServicoService> {
	
	/**
	 * Mtodo principal da ao. 
	 */
	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm actionForm,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		FormRelatorioServicoPeriodo formRelatorio = (FormRelatorioServicoPeriodo) actionForm;

		return super.execute(mapping, actionForm, request, response);
	}
	
	public ActionForward vizualizar(ActionMapping mapping, ActionForm actionForm,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		FormRelatorioServicoPeriodo formRelatorio = (FormRelatorioServicoPeriodo) actionForm;
		Calendar inicio = Calendar.getInstance();
		inicio.set(Calendar.DATE, 1);
		inicio.set(Calendar.MONTH, Integer.parseInt(formRelatorio.getMesInicial()) -1);
		inicio.set(Calendar.YEAR, Integer.parseInt(formRelatorio.getAnoInicial()));
		
		
		Calendar fim = Calendar.getInstance();
		fim.set(Calendar.DATE, 31);
		fim.set(Calendar.MONTH, Integer.parseInt(formRelatorio.getMesFinal()) - 1);
		fim.set(Calendar.YEAR, Integer.parseInt(formRelatorio.getAnoFinal()));
		
		
		boolean servico = formRelatorio.getTipo().intValue() == 1?true:false;
		
		SimpleDateFormat dt = new SimpleDateFormat("dd/MM/yyyy");
		List<Object[]> servicos = service.relatorioServicoPeriodo(inicio.getTime(), fim.getTime(), servico);
		for (Object[] object : servicos) {
			//verifica se o pagamento foi pago
			boolean pago = (Boolean) object[3];
			object[3] = pago?"Sim":"Não";
			
			//verifica o tipo do serviço
			Integer tipo = (Integer) object[1];
			object[1] = TipoServico.recuperarPorId(tipo).getDescricao();
			
			//
			
		}
		
		Font fontItem = new Font(Font.HELVETICA, 8, Font.NORMAL);
	    Font fontTotal = new Font(Font.HELVETICA, 8, Font.BOLD);
	    Font fonteTitulo = new Font(Font.HELVETICA, 10, Font.BOLD);
	    Font fonteTitulo1 = new Font(Font.HELVETICA, 10, Font.BOLD);
	    Font fonteCabecalho = new Font(Font.HELVETICA, 13, Font.BOLD);		
		
		DocumentoBasico documentoBasico = new DocumentoBasico(Constantes.PDF,response);
		Relatorio relatorio = new Relatorio(Constantes.PDF);
		if(servico){
			Paragraph paragraph = new Paragraph(new Phrase("Relatório de Serviços \nde "+dt.format(inicio.getTime()) + " até "+dt.format(fim.getTime()),fonteTitulo));
			paragraph.setAlignment(Paragraph.ALIGN_CENTER);
			documentoBasico.adicionarElemento(paragraph);
		}else{
			Paragraph paragraph = new Paragraph(new Phrase("Relatório de Orçamentos \nde "+dt.format(inicio.getTime()) + " até "+dt.format(fim.getTime()),fonteTitulo));
			paragraph.setAlignment(Paragraph.ALIGN_CENTER);
			documentoBasico.adicionarElemento(paragraph);
		}
		float[] floats =  { 10, 20, 10,50,10 };
		//relatorio.construirTabela(servicos, documentoBasico, floats, "Data","Tipo","Valor", "Pago");
		
		
	    Table table = Relatorio.criarObjetoTabela(true, floats, 5);
	    //setando os titulos
	    Cell tit1 = new Cell(new Phrase("Data",fonteTitulo));
	    tit1.setBackgroundColor(new Color(236, 235, 234));
		table.addCell(tit1);
		
		Cell tit2 = new Cell(new Phrase("Tipo de Serviço",fonteTitulo));
	    tit2.setBackgroundColor(new Color(236, 235, 234));
		table.addCell(tit2);
		
		Cell tit4 = new Cell(new Phrase("Nº Pasta",fonteTitulo));
	    tit4.setBackgroundColor(new Color(236, 235, 234));
		table.addCell(tit4);
		
		Cell tit5 = new Cell(new Phrase("Nome do Paciente",fonteTitulo));
	    tit5.setBackgroundColor(new Color(236, 235, 234));
		table.addCell(tit5);
		
		Cell tit3 = new Cell(new Phrase("Valor",fonteTitulo));
	    tit3.setBackgroundColor(new Color(236, 235, 234));
		table.addCell(tit3);
		
		//totalizadores
		double total = 0.0;
		int isentos = 0;
		
		
		//setando dados
		List<Servico> resultado = service.relatorioServicoPorPeriodo(inicio.getTime(), fim.getTime(), servico);
		for(Servico result : resultado){
			
			
			Cell cel1 = new Cell(new Phrase(dt.format(result.getDataCadastro()),fontItem));
			table.addCell(cel1);
			
			Cell cel2 = new Cell(new Phrase(result.getTipoServico().getDescricao(),fontItem));
			table.addCell(cel2);
			
			
			Cell cel4 = new Cell(new Phrase(StringUtilsOdontosis.colocaZeros(result.getPacienteServico().getNumeroPasta(),10) ,fontItem));
			table.addCell(cel4);
			
			Cell cel5 = new Cell(new Phrase(result.getPacienteServico().getNome(),fontItem));
			table.addCell(cel5);
			
			String valorServico = StringUtilsOdontosis.formatarDouble(result.getValor().doubleValue());
			if(result.isIsento()) {
				valorServico = "isento";
			}
			Cell cel3 = new Cell(new Phrase(valorServico,fontItem));
			table.addCell(cel3);
			
			total += result.getValor().doubleValue();
			
			if(result.isIsento()){
				isentos++;
			}
		}
		
		if(!servico){
			Cell rodape = new Cell(new Phrase("Valor Total\nNúmero de Orçamentos",fontTotal));
			rodape.setColspan(4);
			rodape.setBackgroundColor(new Color(236, 235, 234));    
			table.addCell(rodape);
			
			Cell totaliza = new Cell(new Phrase(StringUtilsOdontosis.formatarDouble(total) +"\n"+ resultado.size() ,fontTotal));
			totaliza.setBackgroundColor(new Color(236, 235, 234));    
			table.addCell(totaliza);
			
		}else{
			Cell rodape = new Cell(new Phrase("Valor Total\nNúmero de Serviços\nServiços isentos",fontTotal));
			rodape.setColspan(4);
			rodape.setBackgroundColor(new Color(236, 235, 234));    
			table.addCell(rodape);
			
			Cell totaliza = new Cell(new Phrase(StringUtilsOdontosis.formatarDouble(total) +"\n"+ resultado.size() +"\n" + isentos,fontTotal));
			totaliza.setBackgroundColor(new Color(236, 235, 234));    
			table.addCell(totaliza);
			
		}
		
		documentoBasico.adicionarElemento(table);
		documentoBasico.fecharDocumento();
		//relatorio.gerarPdf(documentoBasico);
		//documentoBasico.fecharDocumento();
		return null;
	}

}
